# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

rules:
  - name: envoy-als
    layer: MESH
    dsl: |
      filter {
        // only collect abnormal logs (http status code >= 300, or commonProperties?.responseFlags is not empty)
        if (parsed?.response?.responseCode?.value as Integer < 400 && !parsed?.commonProperties?.responseFlags?.toString()?.trim()) {
          abort {}
        }
        extractor {
          if (parsed?.response?.responseCode) {
            tag 'status.code': parsed?.response?.responseCode?.value
          }
          tag 'response.flag': parsed?.commonProperties?.responseFlags
        }
        sink {
          sampler {
            if (parsed?.commonProperties?.responseFlags?.toString()) {
              // use service:errorCode as sampler id so that each service:errorCode has its own sampler,
              // e.g. checkoutservice:[upstreamConnectionFailure], checkoutservice:[upstreamRetryLimitExceeded]
              rateLimit("${log.service}:${parsed?.commonProperties?.responseFlags?.toString()}") {
                rpm 6000
              }
            } else {
              // use service:responseCode as sampler id so that each service:responseCode has its own sampler,
              // e.g. checkoutservice:500, checkoutservice:404.
              rateLimit("${log.service}:${parsed?.response?.responseCode}") {
                rpm 6000
              }
            }
          }
        }
      }
  - name: network-profiling-slow-trace
    layer: MESH
    dsl: |
      filter {
        json{
        }
        extractor{
          if (tag("LOG_KIND") == "NET_PROFILING_SAMPLED_TRACE") {
            sampledTrace {
              latency parsed.latency as Long
              uri parsed.uri as String
              reason parsed.reason as String

              if (parsed.client_process.process_id as String != "") {
                processId parsed.client_process.process_id as String
              } else if (parsed.client_process.local as Boolean) {
                processId ProcessRegistry.generateVirtualLocalProcess(parsed.service as String, parsed.serviceInstance as String) as String
              } else {
                processId ProcessRegistry.generateVirtualRemoteProcess(parsed.service as String, parsed.serviceInstance as String, parsed.client_process.address as String) as String
              }

              if (parsed.server_process.process_id as String != "") {
                destProcessId parsed.server_process.process_id as String
              } else if (parsed.server_process.local as Boolean) {
                destProcessId ProcessRegistry.generateVirtualLocalProcess(parsed.service as String, parsed.serviceInstance as String) as String
              } else {
                destProcessId ProcessRegistry.generateVirtualRemoteProcess(parsed.service as String, parsed.serviceInstance as String, parsed.server_process.address as String) as String
              }

              detectPoint parsed.detect_point as String

              if (parsed.component as String == "http" && parsed.ssl as Boolean) {
                componentId 129
              } else if (parsed.component as String == "http") {
                componentId 49
              } else if (parsed.ssl as Boolean) {
                componentId 130
              } else {
                componentId 110
              }
            }
          }
        }
      }
